package com.lc.common.util;

import cn.hutool.core.collection.CollUtil;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.util.List;

/**
 * Bean工具类
 *
 * @author BruceLee
 */
@Slf4j
public class BeanUtil {

    private BeanUtil() {
        throw new IllegalStateException("util class");
    }

    /**
     * Copy 对象的字段 要求字段名称一致
     *
     * @param clazz  返回类型
     * @param source 元数据
     * @return 返回 param2 的类行 {@link Class}
     */
    public static <T> T copy(Object source, Class<T> clazz) {
        T result;
        try {
            result = clazz.getDeclaredConstructor().newInstance();
        } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
            log.error("Bean Copy Exception [{}]", e.getMessage(), e);
            throw new RuntimeException(e);
        }
        BeanUtils.copyProperties(source, result);
        return result;
    }

    /**
     * @param input 输入集合
     * @param clazz 输出集合类型
     * @param <E>   输入集合类型
     * @param <T>   输出集合类型
     * @return 返回集合
     */
    public static <E, T> List<T> convertListToList(List<E> input, Class<T> clazz) {
        List<T> output = Lists.newArrayList();
        if (CollUtil.isNotEmpty(input)) {
            for (E source : input) {
                T target = BeanUtils.instantiateClass(clazz);
                cn.hutool.core.bean.BeanUtil.copyProperties(source, target);
                output.add(target);
            }
        }
        return output;
    }

}
